package activiti.day03;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.apache.commons.io.IOUtils;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * @Author: 蔡翔
 * @Date: 2019/9/3 13:30
 * @Version 1.0
 *
 * 需求：
 *  从 Acitivit的act_ge_bytearray 表中读取两个资源文件，保存到桌面
 *
 *  技术方案：
 *      1. 第一种方式使用activiti 的api 来实现。
 *      2. 第二种方式：其实就是原理层面，可以使用jdbc的blob类型，clob类型数据的读取，并保存
 *      3. IO流转换，最好commons-io.jar 包 可以轻松解决io操作
 *  真是的应用场景： 用户想查看这个请假流程具体有哪些步骤要走？
 *
 *  流程必须先要存在，才能查询和导出Bpmn，file文件。
 */
public class QueryBpmnFile {
    public static void main(String[] args) throws Exception {
        //1.得到ProcesEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //3.得到查询器：ProcessDefinitionQuery对象
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        //4.设置查询条件、
        processDefinitionQuery.processDefinitionKey("holiday");  //参数是定义的key
        //5.执行查询操作，查询出我们想要的流程定义信息
        ProcessDefinition processDefinition = processDefinitionQuery.singleResult();
        //6.通过流程定义信息，得到部署ID。
        String deploymentId = processDefinition.getDeploymentId();
        //7.通过repositoryService的方法，实现读取图片信息及bpmn文件信息（文件信息只要指的是 输入流）
        //getResourceAsStream(),第一个参数代表部署id，第二个参数代表我们资源名称
        //获取图片资源，这个资源是数据流形式。
        InputStream pngIs = repositoryService.getResourceAsStream(deploymentId,processDefinition.getDiagramResourceName());
        InputStream bpmnIs = repositoryService.getResourceAsStream(deploymentId,processDefinition.getResourceName());
        //8.构造出OutputStream流,刚构造出来的流 ，是空的，也就是空的本地文件。
        OutputStream pngOs = new FileOutputStream("C:\\Users\\wb\\Desktop\\"+processDefinition.getDiagramResourceName());
        OutputStream bpmnOs = new FileOutputStream("C:\\Users\\wb\\Desktop\\"+processDefinition.getResourceName());

        //9.输入流和输出流的转换。 commons-io.jar..其实就是把真是的流转储到 本地的流
        IOUtils.copy(pngIs,pngOs);
        IOUtils.copy(bpmnIs,bpmnOs);

        //10.关闭流
        pngOs.close();
        bpmnOs.close();
        pngIs.close();
        bpmnIs.close();
    }
}
